﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Bibilioteca.Dominio;
using Bibilioteca.Models;

namespace Bibilioteca.Controllers
{
    public class EjemplaresController : Controller
    {
        NegocioEjemplares negocioEjemplares = new NegocioEjemplares();
        private NegocioMateriales materiales = new NegocioMateriales();
        private NegocioAutores autores = new NegocioAutores();
        NegocioLogin negocioLogin = new NegocioLogin();

        /*
         * Retorna un string con los autores del material
         * pasado por parametro.
         */
        private string GetAutoresParaDetails(string id)
        {
            string retorno = "";
            bool primerAutor = true;
            foreach (Autor tip in autores.GetAutoresDeMaterial(id))
            {
                if (primerAutor) { primerAutor = false; }
                else retorno += ", ";
                retorno += tip.Apellido + " " + tip.Nombre;
            }
            return retorno;
        }

        private List<SelectListItem> GetEstados()
        {
            List<SelectListItem> _estados = new List<SelectListItem>();

            _estados.Add(new SelectListItem() { Text = "Disponible", Value = "Disponible" });
            _estados.Add(new SelectListItem() { Text = "Reservado", Value = "Reservado" });
            _estados.Add(new SelectListItem() { Text = "Prestado", Value = "Prestado" });

            return _estados;
        }

        //
        // GET: /Ejemplares/

        public ActionResult Index()
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            return RedirectToAction("Index", "Materiales");
        }

        //
        // GET: /Ejemplares/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Ejemplares/Create

        public ActionResult Create(int id)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            ViewBag.MaterialId = id.ToString();
            return View();
        }

        //
        // POST: /Ejemplares/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                if (ModelState.IsValid)
                {
                    Ejemplar s = new Ejemplar(0, "", Convert.ToInt32(collection["MaterialId"]) );

                    negocioEjemplares.insertarEjemplar(s, Convert.ToInt32(collection["Cantidad"]));

                    return RedirectToAction("Details", "Materiales", new { id = Convert.ToInt32(collection["MaterialId"]) });
                }
                return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }

        //
        // GET: /Ejemplares/Edit/5

        public ActionResult Edit(int id)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            Ejemplar ej = negocioEjemplares.GetEjemplarNumero(id.ToString());
            string idMaterial = ej.SelectedMaterial.ToString();
            ViewBag.Estados = GetEstados();
            ViewBag.TituloMaterial = materiales.GetMaterialNumero(idMaterial).Titulo;
            ViewBag.Autores = GetAutoresParaDetails(idMaterial);
            
            return View(ej);
        }

        //
        // POST: /Ejemplares/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                if (ModelState.IsValid)
                {
                    Ejemplar s = new Ejemplar(
                            Convert.ToInt32(collection["Id"]),
                            Convert.ToString(collection["Estado"]),
                            Convert.ToInt32(collection["SelectedMaterial"])
                            );

                    negocioEjemplares.modificarEjemplar(s);
                    return RedirectToAction("Details", "Materiales", new { id = Convert.ToInt32(collection["SelectedMaterial"]) });
                }
                return RedirectToAction("Index");                
            }
            catch
            {
                Ejemplar ej = negocioEjemplares.GetEjemplarNumero(id.ToString());
                string idMaterial = ej.SelectedMaterial.ToString();
                ViewBag.Estados = GetEstados();
                ViewBag.TituloMaterial = materiales.GetMaterialNumero(idMaterial).Titulo;
                ViewBag.Autores = GetAutoresParaDetails(idMaterial);
                return View();
            }
        }

        //
        // GET: /Ejemplares/Delete/5

        public ActionResult Delete(int id)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            Ejemplar ej = negocioEjemplares.GetEjemplarNumero(id.ToString());
            string idMaterial = ej.SelectedMaterial.ToString();
            
            ViewBag.TituloMaterial = materiales.GetMaterialNumero(idMaterial).Titulo;
            ViewBag.Autores = GetAutoresParaDetails(idMaterial);
            
            return View(ej);
        }

        //
        // POST: /Ejemplares/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            if (!negocioLogin.permisosAdmin(Session))
            {
                String[] s = negocioLogin.redireccion(Session);
                return RedirectToAction(s[0], s[1]);
            }

            try
            {
                string materialSelected = collection["SelectedMaterial"];
                negocioEjemplares.eliminarEjemplar(id);
                return RedirectToAction("Details", "Materiales", new { id = Convert.ToInt32(collection["SelectedMaterial"]) });
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }
    }
}
